package com.wx.gof.pattern.structural.composite.interfacetype;

import java.math.BigDecimal;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 *  * 定义:
 * 组合模式属于对象的结构模式，有时又叫做“部分——整体”模式。合成模式将对象组织到树结构中，
 * 可以用来描述整体与部分的关系。组合模式可以使客户端将单纯元素与复合元素同等看待。
 * 组合模式目的是：让客户端不再区分操作的是树枝对象还是树叶对象，而是以一个统一的方式来操作
 * 适用场景:
 * 1.希望客户端忽略单个元素与复合元素的差异时
 * 2.处理一个树形结构
 * 优点:
 * 1.清楚的定义分层次的复杂对象，表示对象的全部或部分层次
 * 2.让客户端忽略了层次的差异，方便对整个层次结构进行控制
 * 3.简化客户端代码，原因是第二条
 * 缺点:
 * 1.限制类型时会比较复杂-某个节点下只能放文件或者文本，你需要在程序里面去做判断
 * 理解:
 * 应用程序-组合设计模式-接口版 (符合开闭原则，适用于忽略组合对象与单个对象的差异,比如树形结构)
 * @Date 2018-12-09-21:07
 */
public class Application {
    public static void main(String[] agrs) {
        /** Start 创建类型书类型结构 */
        ITreeExtend bookTypeRoot = new BookType("书籍类型根节点", 1);
        ITreeExtend bookTypeLove = new BookType("爱情", 2);
        ITreeExtend bookTyopeFantasy = new BookType("玄幻", 2);
        /** End  */
        
        /** Start 创建书籍 */
        IBook bookJava = new Book("热销书籍Java编程思想","埃克尔",new BigDecimal(79));
        IBook bookJavaConcurrent = new Book("热销书籍Java并发编程的艺术","方腾飞",new BigDecimal(70));
        IBook bookSchool = new Book("校花贴身高手","鱼人二代",new BigDecimal(50));
        IBook bookYuanZhun = new Book("元尊","天蚕土豆",new BigDecimal(50));
        /** End  */

        /** Start 创建书籍目录(懒的建这么多目录，这里也是测试,所有书籍都公用这个目录) */
        IBookCatalog bookCatalogRoot = new BookCatalog("前言",1,1);
        IBookCatalog bookCatalogFirst  = new BookCatalog("第一章",8,2);
        bookCatalogRoot.add(bookCatalogFirst);
        /** End  */

        /** Start 设置书籍目录 */
        bookJava.setBookCatalog(bookCatalogRoot);
        bookJavaConcurrent.setBookCatalog(bookCatalogRoot);
        bookSchool.setBookCatalog(bookCatalogRoot);
        bookYuanZhun.setBookCatalog(bookCatalogRoot);
        /** End  */

        /** Start 设置书类型结构 */
        //直接把热销书籍放到根目录下
        bookTypeRoot.add(bookJava);
        //直接把热销书籍放到根目录下
        bookTypeRoot.add(bookJavaConcurrent);
        //爱情书籍放到爱情分类下
        bookTypeLove.add(bookSchool);
        //修正书籍放到修正分类下
        bookTyopeFantasy.add(bookYuanZhun);
        //爱情分类与修正分类设置到根目录下
        bookTypeRoot.add(bookTypeLove);
        bookTypeRoot.add(bookTyopeFantasy);
        /** End  */

        bookTypeRoot.printContent();

    }
}
